#pragma once
#include <iostream>
#include "Comm.hpp"

//必须有一个进程来创建命名管道
//这个进程必须是读端
//因为读端存在写端不存在会阻塞
//而写端存在读端不存在会被OS杀掉
//初始化命名管道
class Init
{
public:
    Init()
    {
        umask(0);  
        int n=::mkfifo(gpipeFile.c_str(),gmode);
        if(n<0) 
        {
            std::cerr<<"mkfifo error"<<std::endl;
            return;
        }
        std::cout<<"mkfifo success"<<std::endl;
    }
    ~Init()
    {
        //删除文件
        int n=::unlink(gpipeFile.c_str());
        if(n<0)
        {
            std::cerr<<"unlink error"<<std::endl;
            return;
        }
        std::cout<<"unlink success"<<std::endl;
    }
};

Init init;

// 服务端
class Server
{
public:
    Server()
        : _fd(gdefaultid)
    {
    }
    //服务端以只读的方式打开
    bool Open()
    {
        _fd=OpenFife(gidforread);
        if(_fd<0) return false;
        return true;
    }
    //输出型参数 要向out里写
    int ReciveMessage(std::string* out)
    {
        //缓冲区,安全
        char buffer[gsize];
        ssize_t n=::read(_fd,buffer,sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n]=0; //手动处理字符串结尾
            *out=buffer;
        }
        return n;
    }
    void Close()
    {
        CloseFife(_fd);
    }
    ~Server()
    {
    }

private:
    int _fd;
};